/*
 * XMLElement.h
 *
 * Modela un tag, el mismo puede tener mas tags adentro, modelado por los child.
 */


#ifndef XMLNODE_H_
#define XMLNODE_H_

#include <iostream>
#include <fstream>
#include <list>
#include <string>
#include <map>

#include "XmlAttribute.h"
#include "NoSuchXmlElementException.h"

using namespace std;

class XMLElement {
public:
	// Constructores:
	XMLElement(void){};
	XMLElement(string name);
	~XMLElement();

	/*
	 * Retorna el nombre de nodo.
	 */
	string * getName(void);

	/*
	 * setea el nombre de nodo.
	 */
	void setName(string name);

	/*
	 * Retorna el valor de nodo.
	 */
	string * getValue(void);

	/*
	 * setea el valor de nodo.
	 */
	void setValue(string value);

	/*
	 * Retorna una referencia a la lista de attributos correspondientes al nodo-xml.
	 */
	list<XmlAttribute> & getAttributes(void);

	/*
	 * setea una referencia a la lista de attributos correspondientes al nodo-xml.
	 */
	void setAttributes(list<XmlAttribute> & attributes);

	/*
	 * Retorna una referencia a la lista de nodos-xml correspondientes a los hijos del nodo-xml en cuestion.
	 */
	list<XMLElement> & getChildren(void);

	/*
	 * setea una referencia a la lista de nodos-xml correspondientes a los hijos del nodo-xml en cuestion.
	 */
	void setChildren(list<XMLElement> & children);

	/*
	 * Retorna el numero de linea en el cual se encuentra el nodo-xml dentro del file.
	 */
	int getLine(void);

	/*
	 * setea el numero de linea en el cual se encuentra el nodo-xml dentro del file.
	 */
	void setLine(int line);

	/*
	 * Retorna el numero de columna en el cual se encuentra el nodo-xml dentro del file.
	 */
	int getColumn(void);

	/*
	 * setea el numero de columna en el cual se encuentra el nodo-xml dentro del file.
	 */
	void setColumn(int column);

	/*
	 * Retorna el numero de nivel asociado al nodo-xml.
	 */
	int getLevel(void);

	/*
	 * setea el numero de nivel asociado al nodo-xml.
	 */
	void setLevel(int level);

	/*
	 * Retorna un string con informacion del objeto, para su posterior impresion o uso similar.
	 */
	string & toString(void);

	/*
	 * Busca entre los hijos del elemento, y retorna una lista de nodos cuyo nombre es igual al parametro name.
	 */
	list<XMLElement*> getElementsByName(string name);

	/*
	 * Busca entre los hijos del elemento, y retorna el nodo cuyo id es igual al parametro suministrado.
	 */
	XMLElement * getElementById(string idValue);

	/*
	 * Busca entre los attributos del elemento, y retorna aquel cuyo nombre es igual al parametro.
	 */
	XmlAttribute * getAttributeByName(string name);


private:
	//Audit:
	int line;
	int column;
	int level;

	//Functional:
	string name;
	string value;
	list<XmlAttribute> attributes;
	list<XMLElement> children;
};

#endif /* XMLNODE_H_ */
